テスト モック memo
#テスト
テストにおいて「モック」「スタブ」「スパイ」を使うときはいつなのか?
ここに答えれるようになって、適切に使っていきたい所存。
一旦の自分の判断基準
モック使うコスト(2つくらいある。後述)とモックを使わないコストを比べて判断しよう
「モック必要なくね?」て思うときは使わなくていい。
大体、外部システム(データベース、ネットワークなど)はモックした方が良い。特にユニットテストに寄せたいなら。
ここは実際のデータベース使って試した方が良くね?って意見もある。
まあ、データベースを直接操作するやつはモック使わない方がいいかも。
でも、直接操作するクラスに依存するやつは、データベースをモック化した方がいいと思う。じゃないとテストできない。
hr.icon
hr.icon
Pocket - モッククラスを使うべきか否か
必要な場面においてのみ、モックを使うようにしなさい。
モックを作ることで以下のリスク・コストが発生するということを意識しておくonigiri.w2.icon
1. 実体の動作と異なるモックを作ってしまう可能性もある
モックにロジックとか追加して、実体とは異なる物を作ってテストしてしまう可能性あり。
モックを作るなら、もうロジックを作らずにスカラ値だけ返すような感じにしてしまうのがいいだろう。
テスト系コードにロジック入れるのは危ないよ。ほんと。
2. 実体が変更された際、モックも変更する必要が出てくる可能性あり。また、変更し忘れることによって、バグ発生する可能性もあり。
単体テストがモックに依存してるがために、実体の変更に追いつかないと実際の結合時にエラーが起きる確率が高くなる。これはきつい。
モックの使い所参考
(注意:モックを作っても実態と差がない場合は実体を使えばいい)
1. 実体を使うとテストに時間がかかる(テスト時間短縮)
2. 実体をテスト用に準備・使用するのが非常に手間(テストコード作成時簡短縮)
なお、このケースは、実体の設計が不安定である可能性が高いので注意
3. 依存コンポーネントへのインタラクション(実行回数など)を確認したい
4. 実体を使っても起こしにくい状況をテストしたい場合(例外の発生など)
5. 依存する実体がまだ作成されてない
6. 実体を使うことによる副作用が許容できない
なるほどなぁ。モックを使う理由・利益があるよなどれもonigiri.w2.icon
上記のモックのコスト・リスクと得られる利益(モック使わない場合のコスト)を比較しようってことやな。
どっちのコストが大きいかって話や。
依存コンポーネントを実体で利用して、手間なく・デメリットなくテストできるなら実体使えばよろしい。
だけど、モックを使わないとやってられないなら、モックを使おう。
ホイホイonigiri.w2.icon
スタブ・モックは本当に悪者なのか?〜テスト駆動開発をやめて、なお残すべき習慣とは (2) | by Eiji Ienaga | 時を超えたプログラミングの道
基本的には、外部システムに対してスタブ・モック化するのが良いかと思われる
的なことが書かれていたonigiri.w2.icon
あとは、クリーンアーキテクチャをイメージしろと。
外側の奴らは基本モック化。
中の奴らは、単体テストでどうにかせえと。